#ifndef _CTYPE_H
#define _CTYPE_H

#define _U  0x01 /* upper */
#define _L  0x02 /* lower */
#define _D  0x04 /* digit */
#define _C  0x08 /* cntrl */
#define _P  0x10 /* punct */
#define _S  0x20 /* white space (space/lf/tab) */
#define _X  0x40 /* hex digit */
#define _SP 0x80 /* hard space (0x20) */

extern unsigned char _ctype[];
extern char          _ctmp;

#define isalnum(c)  ((_ctype + 1)[c] & (_U | _L | _D))
#define isalpha(c)  ((_ctype + 1)[c] & (_U | _L))
#define iscntrl(c)  ((_ctype + 1)[c] & (_C))
#define isdigit(c)  ((_ctype + 1)[c] & (_D))
#define isgraph(c)  ((_ctype + 1)[c] & (_P | _U | _L | _D))
#define islower(c)  ((_ctype + 1)[c] & (_L))
#define isprint(c)  ((_ctype + 1)[c] & (_P | _U | _L | _D | _SP))
#define ispunct(c)  ((_ctype + 1)[c] & (_P))
#define isspace(c)  ((_ctype + 1)[c] & (_S))
#define isupper(c)  ((_ctype + 1)[c] & (_U))
#define isxdigit(c) ((_ctype + 1)[c] & (_D | _X))

#define isascii(c) (((unsigned)c) <= 0x7f)
#define toascii(c) (((unsigned)c) & 0x7f)

#define tolower(c) (_ctmp = c, isupper(_ctmp) ? _ctmp - ('A' - 'a') : _ctmp)
#define toupper(c) (_ctmp = c, islower(_ctmp) ? _ctmp - ('a' - 'A') : _ctmp)

#endif
